<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" lang="zh-CN" xml:lang="zh-CN">
<head><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
    <title>6.12. GCC-4.0.3</title>
    <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
    <link rel="stylesheet" href="../stylesheets/lfs-print.css" type="text/css" media="print" />
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
  <body id="lfs" class="6.2">
    <div class="navheader">
      <div class="headertitles">
        <h4>Linux From Scratch - 版本 6.2</h4>
        <h3>第六章 安装系统基础软件</h3>
      </div>
      <ul class="headerlinks">
        <li class="prev">
          <a accesskey="p" href="binutils.html" title="Binutils-2.16.1">后退</a>
          <p>Binutils-2.16.1</p>
        </li>
        <li class="next">
          <a accesskey="n" href="db.html" title="Berkeley DB-4.4.20">前进</a>
          <p>Berkeley DB-4.4.20</p>
        </li>
        <li class="up"><a accesskey="u" href="chapter06.html" title="第六章 安装系统基础软件">上一级</a></li>
        <li class="home"><a accesskey="h" href="../index.html" title="Linux From Scratch - 版本 6.2">首页</a></li>
      </ul>
    </div>
    <div class="wrap">
      <div class="titlepage">
        <h1 class="sect1">6.12. GCC-4.0.3</h1>
      </div>
      <div class="package">
        <p>GCC 软件包包含 GNU 编译器，其中有 C 和 C++ 编译器。</p>
        <div class="segmentedlist">
          <div class="seglistitem">
            <div class="seg">
              <strong><span class="segtitle">预计编译时间：</span></strong> <span class="seg">22 SBU (含测试套件)</span>
            </div>
            <div class="seg">
              <strong><span class="segtitle">所需磁盘空间：</span></strong> <span class="seg">566 MB (含测试套件)</span>
            </div>
          </div>
        </div>
      </div>
      <div class="installation">
        <div class="titlepage">
          <h2 class="sect2">6.12.1. 安装 GCC</h2>
        </div>
        <p>使用一个 <span><strong class="command">sed</strong></span> 命令来禁止 GCC 安装它自己的 <tt class="filename">libiberty.a</tt> 。我们将使用 Binutils 附带的 <tt class="filename">libiberty.a</tt> 来代替：</p>
        <pre class="userinput"><kbd class="command">sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in</kbd></pre>
        <p> 在<a href="../chapter05/gcc-pass1.html" title="5.4. GCC-4.0.3 - 第一遍">节 5.4, "GCC-4.0.3 - 第一遍"</a>
 中应用的 bootstrap 编译中，编译器会有 <tt class="option">-fomit-frame-pointer</tt> 的标志。非bootstrap编译默认是忽略这个标志的，可以应用下面的<span><strong class="command">sed</strong></span> 命令来确保编译的可靠性。</p>
        <pre class="userinput"><kbd class="command">sed -i 's/^XCFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in</kbd></pre>
        <p> <span><strong class="command">fixincludes</strong></span> 脚本偶尔会因为修改系统的头文件而出错。因为GCC-4.0.3 和 Glibc-2.3.6 是不需要修改的，运行下面的命令可以避免 <span><strong class="command">fixincludes</strong></span> 脚本运行：</p>
        <pre class="userinput"><kbd class="command">sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in</kbd></pre>
        <p>GCC 中提供了一个 <span><strong class="command">gccbug</strong></span> 脚本，会在编译时侦测 mktemp 是否存在，并且在测试中加强代码。这将会导致脚本使用一些不算很随机的名字来命名临时文件。因为我们后面会安装 mktemp ，这里我们就模仿它的存在：</p>
        <pre class="userinput"><kbd class="command">sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in</kbd></pre>
        <p>GCC 的安装指南推荐用一个新建的目录来编译它，而不是在源码目录中：</p>
        <pre class="userinput"><kbd class="command">mkdir -v ../gcc-build
cd ../gcc-build</kbd></pre>
        <p>为编译 GCC 做准备：</p>
        <pre class="userinput"><kbd class="command">../gcc-4.0.3/configure --prefix=/usr \
    --libexecdir=/usr/lib --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-clocale=gnu --enable-languages=c,c++</kbd></pre>
        <p>编译软件包：</p>
        <pre class="userinput"><kbd class="command">make</kbd></pre>
        <div class="important">
          <div class="admonhead">
            <img alt="[Important]" src="../images/important.png" />
            <h3 class="admontitle">重要</h3>
          </div>
          <div class="admonbody">
            <p>本节的GCC测试套件很重要。在任何情况下都不要省略这一步。</p>
          </div>
        </div>
        <p>运行测试套件，但遇到错误不停止(你还记得那些老是出错的测试吧)：</p>
        <pre class="userinput"><kbd class="command">make -k check</kbd></pre>
        <p>要查看测试单元的测试结果，可以运行：</p>
        <pre class="userinput"><kbd class="command">../gcc-4.0.3/contrib/test_summary</kbd></pre>
        <p>如果只想看概要，可以把输出通过管道传递给 <strong class="userinput"><tt>grep -A7 Summ</tt></strong> 。</p>
        <p>结果可以跟 <a href="http://www.linuxfromscratch.org/lfs/build-logs/6.2/"><i>http://www.linuxfromscratch.org/lfs/build-logs/6.2/</i></a> 的进行比较。</p>
        <p>一些预想不到的错误总是无法避免的。虽然GCC的开发者经常留意这些问题，但是有些还是没有得到解决。通常，<tt class="filename">libmudflap</tt> 测试尤其被认为是有问题的（这是一个bug，参见<a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003"><i>http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003</i></a>）。
          除非测试结果给上面URL的有很多不同，一般是可以安全继续的。</p>
        <p>安装软件包：</p>
        <pre class="userinput"><kbd class="command">make install</kbd></pre>
        <p>有的软件包希望 C PreProcessor(预处理器)安装在 <tt class="filename">/lib</tt> 目录下，为了满足它们的要求，我们创建如下符号链接：</p>
        <pre class="userinput"><kbd class="command">ln -sv ../usr/bin/cpp /lib</kbd></pre>
        <p>许多软件包使用 <span><strong class="command">cc</strong></span> 作为 C 编译器的名字，为了满足它们的要求，创建如下符号链接：</p>
        <pre class="userinput"><kbd class="command">ln -sv gcc /usr/bin/cc</kbd></pre>
        <p>现在，我们的最终工具链已经形成了，我们需要做的就是确保编译、链接按照我们希望的完成。我们可以通过本章前面的简册方法来实现：</p>
        <pre class="userinput"><kbd class="command">echo 'main(){}' &gt; dummy.c
cc dummy.c -Wl,--verbose &amp;&gt; dummy.log
readelf -l a.out | grep ': /lib'</kbd></pre>
        <p>如果所有的都工作正常，就不会有错误，并且命令的输出应该是（允许不同平台的动态链接器的名称不同）：</p>
        <pre class="screen"><tt class="computeroutput">[Requesting program interpreter: /lib/ld-linux.so.2]</tt></pre>
        <p>现在确保我们使用正确的 startfiles：</p>
        <pre class="userinput"><kbd class="command">grep -o '/usr/lib.*/crt[1in].* .*' dummy.log</kbd></pre>
        <p>如果所有的都工作正常，就不会有错误，并且命令的输出应该是：</p>
        <pre class="screen"><tt class="computeroutput">/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crtn.o succeeded</tt></pre>
        <p>接下来，确认新的链接器被应用到了正确的搜索路径中：</p>
        <pre class="userinput"><kbd class="command">grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'</kbd></pre>
        <p>如果所有的都工作正常，就不会有错误，并且命令的输出应该是：</p>
        <pre class="screen"><tt class="computeroutput">SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");</tt></pre>
        <p>现在，确保我们正在使用正确的 libc ：</p>
        <pre class="userinput"><kbd class="command">grep "/lib/libc.so.6 " dummy.log</kbd></pre>
        <p>如果所有的都工作正常，就不会有错误，并且命令的输出应该是</p>
        <pre class="screen"><tt class="computeroutput">attempt to open /lib/libc.so.6 succeeded</tt></pre>
        <p>最后，确保 GCC 正在使用正确的动态链接器：</p>
        <pre class="userinput"><kbd class="command">grep found dummy.log</kbd></pre>
        <p>如果所有的都工作正常，就不会有错误，并且命令的输出应该是（允许不同平台的动态链接器的名称不同）：</p>
        <pre class="screen"><tt class="computeroutput">found ld-linux.so.2 at /lib/ld-linux.so.2</tt></pre>
        <p>如果输出不是像上面那样或者根本没有输出，那么就有大问题了。返回并检查前面的操作，找出问题，并改正过来。最有可能的原因是上面修正 specs 文件时出错。任何一个问题都需要在继续之前解决掉。</p>
        <p>一旦工具都工作正常，清理测试文件：</p>
        <pre class="userinput"><kbd class="command">rm -v dummy.c a.out dummy.log</kbd></pre>
      </div>
      <div class="content">
        <div class="titlepage">
          <a id="contents-gcc" name="contents-gcc"></a>
          <h2 class="sect2">6.12.2. GCC 的内容</h2>
        </div>
        <div class="segmentedlist">
          <div class="seglistitem">
            <div class="seg">
              <strong><span class="segtitle">安装的程序：</span></strong> <span class="seg">c++, cc(→gcc), cpp, g++, gcc, gccbug, gcov</span>
            </div>
            <div class="seg">
              <strong><span class="segtitle">安装的库：</span></strong> <span class="seg">libgcc.a,
              libgcc_eh.a, libgcc_s.so, libstdc++.{a,so}, libsupc++.a</span>
            </div>
          </div>
        </div>
        <div class="variablelist">
          <h3><a id="id3677284" name="id3677284"></a>简要描述</h3>
          <table border="0">
            <col align="left" valign="top" />
            <tbody>
              <tr>
                <td><a id="cc" name="cc"></a><span class="term"><span><strong class="command">cc</strong></span></span></td>
                <td><p>C 编译器</p></td>
              </tr>
              <tr>
                <td><a id="cpp" name="cpp"></a><span class="term"><span><strong class="command">cpp</strong></span></span></td>
                <td><p>C 预处理器。编译器用它来将 #include 和 #define 这类声明在源文件中展开。</p></td>
              </tr>
              <tr>
                <td><a id="c" name="c"></a><span class="term"><span><strong class="command">c++</strong></span></span></td>
                <td><p>C++ 编译器</p></td>
              </tr>
              <tr>
                <td><a id="g" name="g"></a><span class="term"><span><strong class="command">g++</strong></span></span></td>
                <td><p>C++ 编译器</p></td>
              </tr>
              <tr>
                <td><a id="gcc" name="gcc"></a><span class="term"><span><strong class="command">gcc</strong></span></span></td>
                <td><p>C 编译器</p></td>
              </tr>
              <tr>
                <td><a id="gccbug" name="gccbug"></a><span class="term"><span><strong class="command">gccbug</strong></span></span></td>
                <td><p>一个shell脚本，帮助创建有价值的 bug 报告。</p></td>
              </tr>
              <tr>
                <td><a id="gcov" name="gcov"></a><span class="term"><span><strong class="command">gcov</strong></span></span></td>
                <td><p>覆盖测试工具，用来分析在程序的哪里做优化的效果最好。</p></td>
              </tr>
              <tr>
                <td><a id="libgcc" name="libgcc"></a><span class="term"><tt class="filename">libgcc</tt></span></td>
                <td><p><span><strong class="command">gcc</strong></span> 的运行时库</p></td>
              </tr>
              <tr>
                <td><a id="libstdc" name="libstdc"></a><span class="term"><tt class="filename">libstdc++</tt></span></td>
                <td><p>准 C++ 库，包含许多常用的函数。</p></td>
              </tr>
              <tr>
                <td><a id="libsupc" name="libsupc"></a><span class="term"><tt class="filename">libsupc++</tt></span></td>
                <td><p>为 C++ 语言提供支持的库函数。</p></td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>
    <div class="navfooter">
      <ul>
        <li class="prev">
          <a accesskey="p" href="binutils.html" title="Binutils-2.16.1">后退</a>
          <p>Binutils-2.16.1</p>
        </li>
        <li class="next">
          <a accesskey="n" href="db.html" title="Berkeley DB-4.4.20">前进</a>
          <p>Berkeley DB-4.4.20</p>
        </li>
        <li class="up"><a accesskey="u" href="chapter06.html" title="第六章 安装系统基础软件">上一级</a></li>
        <li class="home"><a accesskey="h" href="../index.html" title="Linux From Scratch - 版本 6.2">首页</a>.
        </li>
      </ul>
    </div>
</body></html>
